#!/usr/bin/python3
# @Time    : 2024-03-16 上午 11:14
# @Author  : MingYangHe
# @Email   : 1780040868@qq.com
from typing import List


class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        nums=[i**2 for i in nums]

        return sorted(nums)

    def sortedSquares2(self, nums: List[int]):
        """双指针法
数组其实是有序的， 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端，不是最左边就是最右边，不可能是中间。
此时可以考虑双指针法了，i指向起始位置，j指向终止位置。
定义一个新数组result，和A数组一样的大小，让k指向result数组终止位置。
如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j]; 。
如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i]; 。"""
        i=0
        j=len(nums)-1
        res=nums.copy()
        k=len(nums)-1
        while i<=j:
            if nums[i]**2 <= nums[j]**2:
                res[k]=nums[j]**2
                # print(res[k])
                j-=1
            elif nums[i]**2>nums[j]**2:
                res[k]=nums[i]**2
                # print(res[k])
                i+=1
            k-=1
        return res

    def sortedSquares3(self, nums: List[int]):
        left,right=0,len(nums)-1
        result = [0] * len(nums)
        for i in range(len(nums)-1,-1,-1):
            if abs(nums[left])<=abs(nums[right]):
                result[i]=nums[right]**2
                right-=1
            else:
                result[i]=nums[left]**2
                left+=1
        return result







if __name__ == '__main__':
    sou=Solution()
    # nums = [-4, -1, 0, 3, 10]
    nums = [-7, -3, 2, 3, 11]
    # print(sou.sortedSquares(nums))
    # print(sou.sortedSquares2(nums))
    print(sou.sortedSquares3(nums))